home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / yacc / flexyacc / aflex.lha / aflex / src / symB.a < prev    next >
Text File  |  1991-05-16  |  7KB  |  221 lines

  1. -- Copyright (c) 1990 Regents of the University of California.
  2. -- All rights reserved.
  3. --
  4. -- This software was developed by John Self of the Arcadia project
  5. -- at the University of California, Irvine.
  6. --
  7. -- Redistribution and use in source and binary forms are permitted
  8. -- provided that the above copyright notice and this paragraph are
  9. -- duplicated in all such forms and that any documentation,
  10. -- advertising materials, and other materials related to such
  11. -- distribution and use acknowledge that the software was developed
  12. -- by the University of California, Irvine.  The name of the
  13. -- University may not be used to endorse or promote products derived
  14. -- from this software without specific prior written permission.
  15. -- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  16. -- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  17. -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  
  19. -- TITLE symbol table routines
  20. -- AUTHOR: John Self (UCI)
  21. -- DESCRIPTION implements only a simple symbol table using open hashing
  22. -- NOTES could be faster, but it isn't used much
  23. -- $Header: /co/ua/self/arcadia/aflex/ada/src/RCS/symB.a,v 1.6 90/01/12 15:20:39 self Exp Locker: self $ 
  24.  
  25. with MISC_DEFS, MISC, NFA, TEXT_IO, INT_IO, TSTRING; 
  26.  
  27. package body SYM is 
  28.   use MISC_DEFS; 
  29.   use TSTRING; 
  30.  
  31.   -- addsym - add symbol and definitions to symbol table
  32.   --
  33.   -- true is returned if the symbol already exists, and the change not made.
  34.  
  35.   procedure ADDSYM(SYM, STR_DEF : in VSTRING; 
  36.                    INT_DEF      : in INTEGER; 
  37.                    TABLE        : in out HASH_TABLE; 
  38.                    TABLE_SIZE   : in INTEGER; 
  39.                    RESULT       : out BOOLEAN) is 
  40.     HASH_VAL             : INTEGER := HASHFUNCT(SYM, TABLE_SIZE); 
  41.     SYM_ENTRY            : HASH_LINK := TABLE(HASH_VAL); 
  42.     NEW_ENTRY, SUCCESSOR : HASH_LINK; 
  43.   begin
  44.     while (SYM_ENTRY /= null) loop
  45.       if (SYM = SYM_ENTRY.NAME) then 
  46.  
  47.         -- entry already exists
  48.         RESULT := TRUE; 
  49.         return; 
  50.       end if; 
  51.  
  52.       SYM_ENTRY := SYM_ENTRY.NEXT; 
  53.     end loop; 
  54.  
  55.     -- create new entry
  56.     NEW_ENTRY := new HASH_ENTRY; 
  57.  
  58.     SUCCESSOR := TABLE(HASH_VAL); 
  59.     if ((SUCCESSOR /= null)) then 
  60.       NEW_ENTRY.NEXT := SUCCESSOR; 
  61.       SUCCESSOR.PREV := NEW_ENTRY; 
  62.     else 
  63.       NEW_ENTRY.NEXT := null; 
  64.     end if; 
  65.  
  66.     NEW_ENTRY.PREV := null; 
  67.     NEW_ENTRY.NAME := SYM; 
  68.     NEW_ENTRY.STR_VAL := STR_DEF; 
  69.     NEW_ENTRY.INT_VAL := INT_DEF; 
  70.  
  71.     TABLE(HASH_VAL) := NEW_ENTRY; 
  72.  
  73.     RESULT := FALSE; 
  74.     return; 
  75.  
  76.   exception
  77.     when STORAGE_ERROR => 
  78.       MISC.AFLEXFATAL("symbol table memory allocation failed"); 
  79.   end ADDSYM; 
  80.  
  81.  
  82.   -- cclinstal - save the text of a character class
  83.  
  84.   procedure CCLINSTAL(CCLTXT : in VSTRING; 
  85.                       CCLNUM : in INTEGER) is 
  86.   -- we don't bother checking the return status because we are not called
  87.   -- unless the symbol is new
  88.     DUMMY : BOOLEAN; 
  89.   begin
  90.     ADDSYM(CCLTXT, NUL, CCLNUM, CCLTAB, CCL_HASH_SIZE, DUMMY); 
  91.   end CCLINSTAL; 
  92.  
  93.  
  94.   -- ccllookup - lookup the number associated with character class text
  95.  
  96.   function CCLLOOKUP(CCLTXT : in VSTRING) return INTEGER is 
  97.   begin
  98.     return FINDSYM(CCLTXT, CCLTAB, CCL_HASH_SIZE).INT_VAL; 
  99.   end CCLLOOKUP; 
  100.  
  101.   -- findsym - find symbol in symbol table
  102.  
  103.   function FINDSYM(SYMBOL     : in VSTRING; 
  104.                    TABLE      : in HASH_TABLE; 
  105.                    TABLE_SIZE : in INTEGER) return HASH_LINK is 
  106.     SYM_ENTRY   : HASH_LINK := TABLE(HASHFUNCT(SYMBOL, TABLE_SIZE)); 
  107.     EMPTY_ENTRY : HASH_LINK; 
  108.   begin
  109.     while (SYM_ENTRY /= null) loop
  110.       if (SYMBOL = SYM_ENTRY.NAME) then 
  111.         return SYM_ENTRY; 
  112.       end if; 
  113.       SYM_ENTRY := SYM_ENTRY.NEXT; 
  114.     end loop; 
  115.     EMPTY_ENTRY := new HASH_ENTRY; 
  116.     EMPTY_ENTRY.all := (null, null, NUL, NUL, 0); 
  117.  
  118.     return EMPTY_ENTRY; 
  119.   exception
  120.     when STORAGE_ERROR => 
  121.       MISC.AFLEXFATAL("dynamic memory failure in findsym()"); 
  122.       return EMPTY_ENTRY; 
  123.   end FINDSYM; 
  124.  
  125.   -- hashfunct - compute the hash value for "str" and hash size "hash_size"
  126.  
  127.   function HASHFUNCT(STR       : in VSTRING; 
  128.                      HASH_SIZE : in INTEGER) return INTEGER is 
  129.     HASHVAL, LOCSTR : INTEGER; 
  130.   begin
  131.     HASHVAL := 0; 
  132.     LOCSTR := TSTRING.FIRST; 
  133.  
  134.     while (LOCSTR <= TSTRING.LEN(STR)) loop
  135.       HASHVAL := ((HASHVAL*2) + CHARACTER'POS(CHAR(STR, LOCSTR))) mod HASH_SIZE
  136.         ; 
  137.       LOCSTR := LOCSTR + 1; 
  138.     end loop; 
  139.  
  140.     return HASHVAL; 
  141.   end HASHFUNCT; 
  142.  
  143.  
  144.   --ndinstal - install a name definition
  145.  
  146.   procedure NDINSTAL(ND, DEF : in VSTRING) is 
  147.     RESULT : BOOLEAN; 
  148.   begin
  149.     ADDSYM(ND, DEF, 0, NDTBL, NAME_TABLE_HASH_SIZE, RESULT); 
  150.     if (RESULT) then 
  151.       MISC.SYNERR("name defined twice"); 
  152.     end if; 
  153.   end NDINSTAL; 
  154.  
  155.   -- ndlookup - lookup a name definition
  156.  
  157.   function NDLOOKUP(ND : in VSTRING) return VSTRING is 
  158.   begin
  159.     return FINDSYM(ND, NDTBL, NAME_TABLE_HASH_SIZE).STR_VAL; 
  160.   end NDLOOKUP; 
  161.  
  162.   -- scinstal - make a start condition
  163.   --
  164.   -- NOTE
  165.   --    the start condition is Exclusive if xcluflg is true
  166.  
  167.   procedure SCINSTAL(STR     : in VSTRING; 
  168.                      XCLUFLG : in BOOLEAN) i@
  169.   -- bit of a hack.  We know how the default start-condition is
  170.   -- declared, and don't put out a define for it, because it
  171.   -- would come out as "#define 0 1"
  172.  
  173.   -- actually, this is no longer the case.  The default start-condition
  174.   -- is now called "INITIAL".  But we keep the following for the sake
  175.   -- of future robustness.
  176.     RESULT : BOOLEAN; 
  177.   begin
  178.     if (STR /= VSTR("0")) then 
  179.       TSTRING.PUT(DEF_FILE, STR); 
  180.       TEXT_IO.PUT(DEF_FILE, " : constant := "); 
  181.       INT_IO.PUT(DEF_FILE, LASTSC, 1); 
  182.       TEXT_IO.PUT_LINE(DEF_FILE, ";"); 
  183.     end if; 
  184.  
  185.     LASTSC := LASTSC + 1; 
  186.     if (LASTSC >= CURRENT_MAX_SCS) then 
  187.       CURRENT_MAX_SCS := CURRENT_MAX_SCS + MAX_SCS_INCREMENT; 
  188.  
  189.       NUM_REALLOCS := NUM_REALLOCS + 1; 
  190.  
  191.       REALLOCATE_INTEGER_ARRAY(SCSET, CURRENT_MAX_SCS); 
  192.       REALLOCATE_INTEGER_ARRAY(SCBOL, CURRENT_MAX_SCS); 
  193.       REALLOCATE_BOOLEAN_ARRAY(SCXCLU, CURRENT_MAX_SCS); 
  194.       REALLOCATE_BOOLEAN_ARRAY(SCEOF, CURRENT_MAX_SCS); 
  195.       REALLOCATE_VSTRING_ARRAY(SCNAME, CURRENT_MAX_SCS); 
  196.       REALLOCATE_INTEGER_ARRAY(ACTVSC, CURRENT_MAX_SCS); 
  197.     end if; 
  198.  
  199.     SCNAME(LASTSC) := STR; 
  200.  
  201.     ADDSYM(SCNAME(LASTSC), NUL, LASTSC, SCTBL, START_COND_HASH_SIZE, RESULT); 
  202.     if (RESULT) then 
  203.       MISC.AFLEXERROR("start condition " & STR & " declared twice"); 
  204.     end if; 
  205.  
  206.     SCSET(LASTSC) := NFA.MKSTATE(SYM_EPSILON); 
  207.     SCBOL(LASTSC) := NFA.MKSTATE(SYM_EPSILON); 
  208.     SCXCLU(LASTSC) := XCLUFLG; 
  209.     SCEOF(LASTSC) := FALSE; 
  210.   end SCINSTAL; 
  211.  
  212.  
  213.   -- sclookup - lookup the number associated with a start condition
  214.  
  215.   function SCLOOKUP(STR : in VSTRING) return INTEGER is 
  216.   begin
  217.     return FINDSYM(STR, SCTBL, START_COND_HASH_SIZE).INT_VAL; 
  218.   end SCLOOKUP; 
  219.  
  220. end SYM; 
  221.